/*
  数组的实例方法：
     reduce(callback, [initialValue])
      作用：汇总，根据已有的数组得到一个最终(整体)的结果，比如：对数组进行求和
      返回：汇总的（整体）结果
      语法：两个参数
        array.reduce((accumulator, currentValue, currentIndex, array) => {
          accumulator: 累加器
          currentValue： 当前数组中的元素
          currentIndex：当前元素在数组的中的下标
          array：数组对象本身

          initialValue: 可选参数，会影响accumulator的初始值，
          如果没给initialValue，
          那么accumulator取自数组中第一个元素，
          此时cuurentValue会取自数组中第二个元素，开始迭代

          如果给定了initialValue，
          那么initialValue会作为accumulator的初始值，
          此时currentValue会取自数组中第一个元素，开始迭代
      }, [initialValue])

      常见的应用场景：
        1. 数组求和
        2. 根据数组得到一个对象
        3. 根据数组得到一个数组

      小结：
        1. 什么时候可以不用给初始值：纯数字求和、求积
        2. 什么时候必须给初始值：数组中放的是对象求和（汇总）
 */

//1. 基本类型，对四大美女的 腰围 ，进行求和
// const waistlines = [55, 43, 70, 58]
// const result = waistlines.reduce((accu = 168, cur, index, arr) => {
// 第一次执行：55 + 43 => 98
// 第二次执行：55 + 43 + 70 => 168
// 第三次执行：55 + 43 + 70 + 58 => 226
//   return accu + cur
// })
// console.log(result)

// const result = waistlines.reduce((accu, cur, index, arr) => {
// console.log(accu, cur, index, arr)
// return accu + cur
// 10 55 0[55, 43, 70, 58]
// undefined 43 1[55, 43, 70, 58]
// undefined 70 2[55, 43, 70, 58]
// undefined 58 3[55, 43, 70, 58]
// }, 0)
// console.log(result)

// 2. 引用类型，求平均身高
const girls = [
  {
    name: '王昭君',
    height: 170
  }, {
    name: '貂蝉',
    height: 172
  }, {
    name: '西施',
    height: 162
  }, {
    name: '杨玉环',
    height: 169
  }
]
const result = girls.reduce((acc = 504, cur) => {
  // 0 + 170 => 170
  // 170 + 172 => 342
  // 342 + 162 => 504
  // 504 + 169 => 673
  return acc + cur.height
}, 0)
console.log(result)



/*
3. reduce的应用，解决实际需求：
1. 根据ASCII码数组 ['73', '32', '108', '111', '118', '101', '32', '121', '111', '117']，
   得到一个字符串
2. 对数组：[
  {
    name: '篮球',
    price: 198,
    num: 2
  }, {
    name: '球鞋',
    price: 1999,
    num: 1
  }, {
    name: '球衣',
    price: 99,
    num: 4
  }, {
    name: '护腕',
    price: 29,
    num: 10
  }
]，求总价格

3. 统计每个名字出现的次数：['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']

4. 根据数据：['北京', '上海', '北京', '深圳', '杭州', '上海', '北京']
    得到数组 [['北京', 3], ['上海', 2], ['深圳', 1], ['杭州', 1]]

5. 更多关于reduce的面试及应用,  B站 [技术痞瑞] get更多技能

*/